package com.efuture.chaptersix

/* @Description:Kotlin语言范型变换实战
 * @Auther: zhaoshanshan
 * @Date: 2022/03/08/12:16 下午
 */
class Demo98<T>(val flag:Boolean=false,val inputType:T){
  //模仿RxJava  T是要变化的输入类型 R是变化后的输出类型
  //map 函数返回R?是因为 flag 为false的时候 返回值为null
  // inline 加入内联 是因为map函数入参是个lambda表达式 以此来提升性能
  inline fun <R> map(mapAction:(T)->R):R?=mapAction(inputType).takeIf { flag }

}

inline fun<I,O> map(inputValue:I,isMap:Boolean = true,mapActionLambda:(I)->O):O?{
    return if(isMap)  {
        mapActionLambda(inputValue)
    } else {
        null
    }
}



data class Demo98Test1(val name:String,val age:Int);
data class Demo98Test2(val name:String,val age:Int);

fun main() {

    //将int 转换成String
    val d = Demo98(true,123)
    val r = d.map {
      it.toString()//输入为int 输出为String
    }
    println("r:$r")
    println("r is String:${r is String}")//true

    //将Demo98Test1 转换成Demo98Test2
    val d1 = Demo98(true,Demo98Test1("赵山山",30))
    val r2 = d1.map {
        Demo98Test2(it.name,it.age)
    }
    println("r2:$r2")
    println("r2 is Demo98Test2:${r2 is Demo98Test2}")//true


    //直接调用map函数 模仿RxJava
    val r3 = map(456){
        it.toString()
    }
    println("r3:$r3")
}
    